package com.zkingsoft.services.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.aspectj.apache.bcel.classfile.Constant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.zkingsoft.constance.Dictionary;
import com.zkingsoft.constance.SystemConstance;
import com.zkingsoft.dao.BugDao;
import com.zkingsoft.dao.BugFlowDao;
import com.zkingsoft.dao.ProjUserDao;
import com.zkingsoft.exception.GlobleException;
import com.zkingsoft.model.Bug;
import com.zkingsoft.model.BugFlow;
import com.zkingsoft.model.ProjUser;
import com.zkingsoft.model.Task;
import com.zkingsoft.model.Users;
import com.zkingsoft.plugin.pojo.PaginationVO;
import com.zkingsoft.plugin.util.WebUtil;
import com.zkingsoft.services.BugService;

/**
 * This field was generated by Zking.software.Codegen.
 * 
 * @date 2016-11-09 14:37
 */
@Service("bugService")
public class BugServiceImpl implements BugService {

	@Autowired
	private BugDao bugDao;
	@Autowired
	private BugFlowDao bugFlowDao;
	@Autowired
	private ProjUserDao projUserDao;

	@Override
	public int add(Bug bug) {
		// 权限验证，只有产品经理和测试工程师才有权限添加bug
		int i = 0;
		Users user = (Users) WebUtil.getSession().getAttribute(SystemConstance.LOGIN_KEY);
		ProjUser projUser = new ProjUser();
		projUser.setUserId(user.getId());
		projUser.setProjId(bug.getProjId());
		List<ProjUser> postList = projUserDao.selectByModel(projUser);
		if (postList.size() <= 0) {
			throw new GlobleException("您不在这个项目中，无权限对该项目提bug!");
		}
		// 判断bug添加人的职位，为项目经理，产品经理，和测试工程师才能添加bug
		boolean flag = false;
		for (ProjUser obj : postList) {
			if (obj.getPostName().equals(Dictionary.POST_NAME_CPJL)
					|| obj.getPostName().equals(Dictionary.POST_NAME_XMJL)
					|| obj.getPostName().equals(Dictionary.POST_NAME_CEGCS)) {
				flag = true;
				break;
			}
		}
		if (flag) {
			// 新增的bug方案为待解决
			bug.setType(Dictionary.BUG_TYPE_VAITE);
			bug.setCreateTime(new Date());
			// 新增的bug方案为待解决
			bug.setStatus(Dictionary.BUG_STATUS_VAITE);
			bug.setCreateUserId(user.getId());
			// bug的指派人为bug的拥有者
			bug.setOwnerUserId(bug.getUserId());
			i = bugDao.insert(bug);
		} else {
			throw new GlobleException("您在项目中的职位不是产品经理、项目经理、测试工程，无权限提bug");
		}
		return i;
	}

	@Override
	public int modify(Bug bug) {
		Users user = (Users) WebUtil.getSession().getAttribute(SystemConstance.LOGIN_KEY);
		Bug getBug = bugDao.selectById(bug.getId());
		// 修改判断权限，只能是创建人去修改
		if (!getBug.getCreateUserId().equals(user.getId())) {
			throw new GlobleException("您不是创建人没权限修改");
		}
		return bugDao.update(bug);

	}

	@Override
	public int remove(List<Long> list) {

		return bugDao.deleteByIds(list);

	}

	@Override
	public int removeById(Long id) {

		return bugDao.deleteById(id);

	}

	@Override
	public int removeByModel(Bug bug) {

		return bugDao.deleteByModel(bug);

	}

	@Override
	public List<Bug> findInPage(Bug bug, PaginationVO pageVo) {

		return bugDao.selectInPage(bug, pageVo);

	}

	@Override
	public List<Bug> findByModel(Bug bug) {

		return bugDao.selectByModel(bug);

	}

	@Override
	public int findTotal(Bug bug) {

		return bugDao.selectTotalRecord(bug);

	}

	@Override
	public Bug findById(Long id) {

		return bugDao.selectById(id);

	}

	@Override
	@Transactional
	public int handleBug(Bug bug, BugFlow bugFlow) {
		int i = 0, j = 0;
		i = bugDao.update(bug);
		j = bugFlowDao.insert(bugFlow);
		return i > 0 && j > 0 ? 1 : 0;
	}

	/**
	 * @Description:根据id查询bug和钉钉
	 * @author:chenxianzi
	 * @param id
	 * @return 返回类型 List<Bug>
	 * @date 2016年12月15日
	 */
	@Override
	public List<Bug> findBugAndDdUserId(Long id) {

		return bugDao.selectBugAndDdUserId(id);
	}

	/**
	 * 
	 * @Description:增加并返回主键id
	 * @author:chen
	 * @param TODO
	 * @return Long
	 * @date 2016年12月15日
	 */
	@Override
	public Long addsAndReturnId(Bug bug) {
		Users user = (Users) WebUtil.getSession().getAttribute(SystemConstance.LOGIN_KEY);
		System.out.println(user.getName());
		ProjUser projUser = new ProjUser();
		projUser.setUserId(user.getId());
		projUser.setProjId(bug.getProjId());
		List<ProjUser> postList = projUserDao.selectByModel(projUser);
		if (postList.size() <= 0) {
			throw new GlobleException("您不在这个项目中，无权限对该项目提bug!");
		}
		// 判断bug添加人的职位，为项目经理，产品经理，和测试工程师才能添加bug
		boolean flag = false;
		for (ProjUser obj : postList) {
			if (obj.getPostName().equals(Dictionary.POST_NAME_CPJL)
					|| obj.getPostName().equals(Dictionary.POST_NAME_XMJL)
					|| obj.getPostName().equals(Dictionary.POST_NAME_CEGCS)) {
				flag = true;
				break;
			}
		}
		if (flag) {
			// 新增的bug方案为待解决
			bug.setType(Dictionary.BUG_TYPE_VAITE);
			bug.setCreateTime(new Date());
			// 新增的bug状态为待解决
			bug.setStatus(Dictionary.BUG_STATUS_VAITE);
			bug.setCreateUserId(user.getId());
			bug.setBugNo(selectMaxNo(bug.getProjId()) + 1);
			// bug的指派人为bug的拥有者
			bug.setOwnerUserId(bug.getUserId());
			bugDao.insert(bug);
			return bug.getId();
		} else {
			throw new GlobleException("您在项目中的职位不是产品经理、项目经理、测试工程，无权限提bug");
		}
	}

	private int selectMaxNo(Long projId) {
		Integer maxNo = bugDao.selectMaxNo(projId);
		return maxNo == null ? 0 : maxNo;
	}

}